[アップデート] Amazon CloudFront でアプリケーション向けのマネージドキャッシュポリシーが追加されました

[アップデート] Amazon CloudFront でアプリケーション向けのマネージドキャッシュポリシーが追加されました

Clock Icon2024.07.09

こんにちは、森田です。

以下のアップデートでアプリケーション向けのマネージドキャッシュポリシーが2つ追加されました。

https://aws.amazon.com/about-aws/whats-new/2024/07/amazon-cloudfront-managed-cache-policies-web-applications/

追加されたキャッシュポリシーについて

今回追加されたキャッシュポリシーについては、オリジンサーバーが Cache-Control ヘッダーを返すようなアプリケーションでの利用が想定されています。

従来のマネージドキャッシュポリシーでは、アプリケーション向けのポリシーは提供されておらず、ヘッダーやCookie、クエリ文字列を考慮したキャッシュを行いたい場合は、個別でカスタムキャッシュポリシーを作成する必要がありました。

追加された2つのポリシーについては、TTL等は同じですが、キャッシュキーにクエリ文字列 含めるかが異なっています。

UseOriginCacheControlHeaders

キャッシュキーに利用される情報

  • Header
    • Host
    • Origin
    • X-HTTP-Method-Override
    • X-HTTP-Method
    • X-Method-Override
  • Cookie

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-cache-policies.html#managed-cache-policy-origin-cache-headers

UseOriginCacheControlHeaders-QueryStrings

キャッシュキーに利用される情報

  • Header
    • Host
    • Origin
    • X-HTTP-Method-Override
    • X-HTTP-Method
    • X-Method-Override
  • Cookie
  • クエリ文字列

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-cache-policies.html#managed-cache-policy-origin-cache-headers-query-strings

やってみた

実際に追加されたポリシーを使って、CloudFrontを作成し、動作を確認してみたいと思います。

CloudFrontのオリジンには、EC2(ドメイン名付与)を利用します。

Untitled (5)

EC2では、以下のような簡易的なサーバを起動します。

server.py
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.after_request
def after_request(response):
    response.headers['Cache-Control'] = "max-age=10"
    return response

@app.route("/", methods=["GET"])
def header_func():
  header = dict(request.headers)
  return jsonify(header)

@app.route("/query", methods=["GET"])
def query_func():
  req = dict(request.args)
  return jsonify(req)

app.run(host="0.0.0.0", port=80, debug=True)

CloudFront の設定

パスに応じてキャッシュポリシーを分けたいため以下のように設定します。

パス 割り当てるキャッシュポリシー
/query UseOriginCacheControlHeaders-QueryStrings
/ UseOriginCacheControlHeaders

スクリーンショット_2024-07-09_22_37_08

動作確認

UseOriginCacheControlHeaders

Cookieを固定

以下スクリプトで Cookie を固定として curl を実行してみます。

get.sh
get.sh
#!/bin/bash

while true; do
  x_cache=$(curl -s -I "https://ディストリビューションドメイン名" -H "Cookie: count=100" | grep -i "x-cache" | awk '{print $2}')
  echo "$(date '+%Y-%m-%d %H:%M:%S') - X-Cache: $x_cache"
  sleep 1
done
実行結果
% bash get.sh 
2024-07-09 21:40:12 - X-Cache: Miss
2024-07-09 21:40:13 - X-Cache: Hit
2024-07-09 21:40:15 - X-Cache: Hit
2024-07-09 21:40:16 - X-Cache: Hit
2024-07-09 21:40:17 - X-Cache: Hit
2024-07-09 21:40:18 - X-Cache: Hit
2024-07-09 21:40:20 - X-Cache: Hit
2024-07-09 21:40:21 - X-Cache: Hit
2024-07-09 21:40:22 - X-Cache: Miss
2024-07-09 21:40:24 - X-Cache: Hit
2024-07-09 21:40:25 - X-Cache: Hit
2024-07-09 21:40:26 - X-Cache: Hit
2024-07-09 21:40:27 - X-Cache: Hit
2024-07-09 21:40:28 - X-Cache: Hit
2024-07-09 21:40:30 - X-Cache: Hit
2024-07-09 21:40:31 - X-Cache: Hit
2024-07-09 21:40:33 - X-Cache: Miss
2024-07-09 21:40:34 - X-Cache: Hit

期待通り10秒間はキャッシュの利用ができているようです。

Cookieを可変

今度は、以下スクリプトで Cookie を可変にして curl を実行してみます。

count.sh
count.sh
#!/bin/bash

count=0

while true; do
  count=$((count+1))
  x_cache=$(curl -s -I "https://ディストリビューションドメイン名" -H "Cookie: count=$count" | grep -i "x-cache" | awk '{print $2}')
  echo "Count: $count - X-Cache: $x_cache"
  sleep 1
done
実行結果
% bash count.sh 
Count: 1 - X-Cache: Miss
Count: 2 - X-Cache: Miss
Count: 3 - X-Cache: Miss
Count: 4 - X-Cache: Miss
Count: 5 - X-Cache: Miss
Count: 6 - X-Cache: Miss
Count: 7 - X-Cache: Miss
Count: 8 - X-Cache: Miss
Count: 9 - X-Cache: Miss
Count: 10 - X-Cache: Miss

Cookie が都度変更となるため、キャッシュキーも変更となり、全てキャッシュの利用は行っていない結果となりました。

UseOriginCacheControlHeaders-QueryStrings

クエリ文字列を固定

以下スクリプトでクエリ文字列を固定として curl を実行してみます。

get.sh
get.sh
#!/bin/bash

while true; do
  x_cache=$(curl -s -I "https://ディストリビューションドメイン名/query?count=100"  | grep -i "x-cache" | awk '{print $2}')
  echo "$(date '+%Y-%m-%d %H:%M:%S') - X-Cache: $x_cache"
  sleep 1
done
実行結果
% bash get.sh 
2024-07-09 21:49:41 - X-Cache: Miss
2024-07-09 21:49:42 - X-Cache: Hit
2024-07-09 21:49:43 - X-Cache: Hit
2024-07-09 21:49:44 - X-Cache: Hit
2024-07-09 21:49:46 - X-Cache: Hit
2024-07-09 21:49:47 - X-Cache: Hit
2024-07-09 21:49:48 - X-Cache: Hit
2024-07-09 21:49:49 - X-Cache: Hit
2024-07-09 21:49:50 - X-Cache: Hit
2024-07-09 21:49:51 - X-Cache: Miss
2024-07-09 21:49:52 - X-Cache: Hit

クエリ文字列を固定としているため、キャッシュキーも固定となり、期待通り10秒間はキャッシュの利用ができているようです。

クエリ文字列を可変

今度は、以下スクリプトでクエリ文字列を可変にして curl を実行してみます。

count.sh
count.sh
#!/bin/bash

count=0

while true; do
  count=$((count+1))
  x_cache=$(curl -s -I "https://ディストリビューションドメイン名/query?count=$count" | grep -i "x-cache" | awk '{print $2}')
  echo "Count: $count - X-Cache: $x_cache"
  sleep 1
done
実行結果
% bash count.sh 
Count: 1 - X-Cache: Miss
Count: 2 - X-Cache: Miss
Count: 3 - X-Cache: Miss
Count: 4 - X-Cache: Miss
Count: 5 - X-Cache: Miss
Count: 6 - X-Cache: Miss
Count: 7 - X-Cache: Miss
Count: 8 - X-Cache: Miss
Count: 9 - X-Cache: Miss
Count: 10 - X-Cache: Miss
Count: 11 - X-Cache: Miss
Count: 12 - X-Cache: Miss

こちらも期待通り、全てキャッシュの利用は行っていないことが確認できました。

さいごに

今回追加されたマネージドキャッシュポリシーを利用することで、 Cookie やクエリ文字列を基準にキャッシュの制御ができるようになります。

例えば、Cookieやクエリ文字列ごとに配信するコンテンツが異なるECサイトやCMSなどの用途でベースラインとして利用すると良いでしょう。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.